package com.apstest.core.domain;

import com.itextpdf.text.*;
import com.itextpdf.text.Font;
import com.itextpdf.text.List;
import com.itextpdf.text.pdf.*;
import com.itextpdf.awt.*;

import java.awt.*;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * @Author nbZhuozh
 * @Date 2025-06-03  16:13
 **/
public class MergeTableUnitDemo {
    // 定义常用颜色
    private static final BaseColor HEADER_COLOR = new BaseColor(70, 130, 180);
    private static final BaseColor MERGE_COLOR = new BaseColor(230, 240, 255);
    private static final BaseColor SECTION_COLOR = new BaseColor(50, 50, 100);
    private static final BaseColor EXAMPLE_COLOR = new BaseColor(60, 110, 180);

    public static void main(String[] args) {
        try {
            // 创建PDF文档
            Document document = new Document(PageSize.A4);
            PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("TableCellMerging2.pdf"));

            // 添加元数据
            document.addAuthor("iText5表格合并单元格示例");
            document.addTitle("表格合并单元格技术");
            document.addSubject("左右合并，上下合并，复杂合并");

            document.open();

            // 注册中文字体
            BaseFont baseFont = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.EMBEDDED);
            //正文标题字体
            Font titleFont = new Font(baseFont, 22, Font.BOLD, SECTION_COLOR);
            //第一标题字体
            Font sectionFont = new Font(baseFont, 16, Font.BOLD, EXAMPLE_COLOR);
            //表格表头字体
            Font tableHeaderFont = new Font(baseFont, 12, Font.BOLD, BaseColor.WHITE);
            //表格单元格字体
            Font tableCellFont = new Font(baseFont, 11, Font.BOLD, BaseColor.BLACK);
            //描述、注释字体
            Font descriptionFont = new Font(baseFont, 10, Font.ITALIC, BaseColor.GRAY);
            // 添加标题
            Paragraph title = new Paragraph("表格单元格合并技术", titleFont);
            title.setAlignment(Element.ALIGN_CENTER);
            title.setSpacingAfter(10);
            document.add(title);

            // 添加描述
            Paragraph intro = new Paragraph("本示例演示了在iText5中实现各种单元格合并的技术，包括左右合并（跨列）、上下合并（跨行）以及复杂合并。", descriptionFont);
            intro.setSpacingAfter(15);
            document.add(intro);

            // 示例1：左右合并
            addSection(document, "示例1: 左右合并（跨列）", sectionFont);
            document.add(createHorizontalMergeExample(tableHeaderFont, tableCellFont));
            addDescription(document, "左右合并使用setColspan()方法实现，可将多个列合并为一个单元格。", descriptionFont);

            // 示例2：上下合并
            addSection(document, "示例2: 上下合并（跨行）", sectionFont);
            document.add(createVerticalMergeExample(tableHeaderFont, tableCellFont));
            addDescription(document, "上下合并使用setRowspan()方法实现，可将多个行合并为一个单元格。", descriptionFont);

            // 示例3：复杂合并
            addSection(document, "示例3: 复杂合并（跨行+跨列）", sectionFont);
            document.add(createComplexMergeExample(tableHeaderFont, tableCellFont));
            addDescription(document, "复杂合并结合使用setRowspan()和setColspan()，可实现跨多行多列的单元格合并。", descriptionFont);

            // 添加总结
            Paragraph summary = new Paragraph("单元格合并总结:", tableHeaderFont);
            summary.setIndentationLeft(20);
            document.add(summary);

            // 添加总结列表
            List summaryList = new List(List.UNORDERED);
            summaryList.setListSymbol("\u2022");
            summaryList.setIndentationLeft(40);
            summaryList.add(new ListItem("左右合并: setColspan(n) - 将n列合并为一个单元格", descriptionFont));
            summaryList.add(new ListItem("上下合并: setRowspan(n) - 将n行合并为一个单元格", descriptionFont));
            summaryList.add(new ListItem("复杂合并: 同时设置setRowspan(m)和setColspan(n) - 合并m行n列的区域", descriptionFont));
            summaryList.add(new ListItem("应用场景: 表头设计、多级分类、不规则表格布局等", descriptionFont));
            document.add(summaryList);

            // 文档结尾
            Paragraph footer = new Paragraph("文档生成时间: " + new java.util.Date() +
                    " | iText5版本: 5.5.13", descriptionFont);
            footer.setAlignment(Element.ALIGN_CENTER);
            footer.setSpacingBefore(20);
            document.add(footer);

            document.close();

            System.out.println("PDF文件已生成: TableCellMerging.pdf");

        } catch (DocumentException | IOException e) {
            e.printStackTrace();
        }
    }

    // 添加段落的方法
    private static void addSection(Document document, String text, Font font) throws DocumentException {
        Paragraph section = new Paragraph(text, font);
        section.setSpacingBefore(25);
        section.setSpacingAfter(10);
        document.add(section);
    }

    // 添加描述文本
    private static void addDescription(Document document, String text, Font font) throws DocumentException {
        Paragraph desc = new Paragraph(text, font);
        desc.setSpacingBefore(5);
        desc.setSpacingAfter(15);
        document.add(desc);
    }

    // 左右合并示例
    private static PdfPTable createHorizontalMergeExample(Font headerFont, Font cellFont) throws DocumentException {
        PdfPTable table = new PdfPTable(4); // 4列
        table.setWidthPercentage(95);
        table.setSpacingAfter(5);

        // 设置列宽比例
        float[] colWidths = {1.5f, 1.5f, 2f, 1f};
        table.setWidths(colWidths);

        // 表头
        addTableHeader(table, "部门", headerFont);
        addTableHeader(table, "小组", headerFont);
        addTableHeader(table, "项目", headerFont);
        addTableHeader(table, "预算", headerFont);

        // 数据行1
        addTableCell(table, "研发部", cellFont, MERGE_COLOR);
        addTableCell(table, "Java组", cellFont);
        addTableCell(table, "系统重构", cellFont);
        addTableCell(table, "¥120,000", cellFont);

        // 数据行2
        addTableCell(table, "研发部", cellFont, MERGE_COLOR);
        addTableCell(table, "Java组", cellFont);
        addTableCell(table, "性能优化", cellFont);
        addTableCell(table, "¥80,000", cellFont);

        // 数据行3 - 有合并单元格
        addTableCell(table, "市场部", cellFont, MERGE_COLOR);
        PdfPCell mergedCell = createMergedCellColumn("全年推广计划", cellFont, BaseColor.YELLOW, 2);
        table.addCell(mergedCell);
        addTableCell(table, "¥300,000", cellFont);

        // 数据行4 - 有合并单元格
        addTableCell(table, "人事部", cellFont, MERGE_COLOR);
        mergedCell = createMergedCellColumn("招聘计划\n人才引进\n员工培训", cellFont, new BaseColor(240, 230, 200), 3);
        mergedCell.setHorizontalAlignment(Element.ALIGN_CENTER);
        mergedCell.setVerticalAlignment(Element.ALIGN_MIDDLE);
        table.addCell(mergedCell);

        return table;
    }

    // 上下合并示例
    private static PdfPTable createVerticalMergeExample(Font headerFont, Font cellFont) {
        PdfPTable table = new PdfPTable(4);
        table.setWidthPercentage(95);
        table.setSpacingAfter(5);

        // 表头
        addTableHeader(table, "季度", headerFont);
        addTableHeader(table, "产品线", headerFont);
        addTableHeader(table, "销售额", headerFont);
        addTableHeader(table, "增长率", headerFont);

        // 第一行
        addTableCell(table, "Q1", cellFont);
        addTableCell(table, "A系列", cellFont);
        addTableCell(table, "¥580,000", cellFont);
        addTableCell(table, "+12%", cellFont);

        // 第二行
        PdfPCell mergedCell = createMergedCell("Q2", cellFont, new BaseColor(220, 240, 255), 1, 2);
        table.addCell(mergedCell);
        addTableCell(table, "A系列", cellFont);
        addTableCell(table, "¥620,000", cellFont);
        addTableCell(table, "+15%", cellFont);

        // 第三行
        addTableCell(table, "B系列", cellFont);
        addTableCell(table, "¥480,000", cellFont);
        addTableCell(table, "+18%", cellFont);

        // 第四行
        mergedCell = createMergedCell("Q3", cellFont, new BaseColor(255, 235, 205), 1, 3);
        table.addCell(mergedCell);
        addTableCell(table, "A系列", cellFont);
        addTableCell(table, "¥710,000", cellFont);
        addTableCell(table, "+18%", cellFont);

        // 第五行
        addTableCell(table, "B系列", cellFont);
        addTableCell(table, "¥520,000", cellFont);
        addTableCell(table, "+21%", cellFont);

        // 第六行
        addTableCell(table, "C系列", cellFont);
        addTableCell(table, "¥380,000", cellFont);
        addTableCell(table, "+25%", cellFont);

        return table;
    }

    // 复杂合并示例
    private static PdfPTable createComplexMergeExample(Font headerFont, Font cellFont) throws DocumentException {
        PdfPTable table = new PdfPTable(5);
        table.setWidthPercentage(95);
        table.setSpacingAfter(5);

        // 设置列宽
        float[] colWidths = {1.2f, 1.2f, 1.2f, 1.2f, 1.2f};
        table.setWidths(colWidths);

        // 表头
        addTableHeader(table, "年份", headerFont);
        addTableHeader(table, "产品类别", headerFont);
        addTableHeader(table, "销售区域", headerFont);
        addTableHeader(table, "销售额", headerFont);
        addTableHeader(table, "市场占比", headerFont);

        // 第一行
        PdfPCell yearCell = createMergedCell("2023", cellFont, new BaseColor(240, 230, 255), 1, 5);
        table.addCell(yearCell);

        // 第二行
        PdfPCell categoryCell = createMergedCell("电子产品", cellFont, new BaseColor(220, 240, 200), 1, 3);
        table.addCell(categoryCell);
        addTableCell(table, "¥2,400,000", cellFont);
        addTableCell(table, "38%", cellFont);

        // 第三行 - 空行
        for (int i = 0; i < 5; i++) {
            addTableCell(table, "", cellFont);
        }

        // 第四行
        addTableCell(table, "家电", cellFont, new BaseColor(240, 220, 230));
        PdfPCell complexCell1 = createMergedCell("全国数据", cellFont, new BaseColor(255, 240, 220), 1, 2);
        table.addCell(complexCell1);
        addTableCell(table, "¥1,800,000", cellFont);
        addTableCell(table, "28%", cellFont);

        // 第五行 - 分解为区域数据
        addTableCell(table, "", cellFont); // 保留合并位置
        addTableCell(table, "华东", cellFont);
        addTableCell(table, "华北", cellFont);
        addTableCell(table, "¥950,000", cellFont);
        addTableCell(table, "15%", cellFont);

        // 第六行
        addTableCell(table, "", cellFont); // 保留合并位置
        addTableCell(table, "华南", cellFont);
        addTableCell(table, "西南", cellFont);
        addTableCell(table, "¥850,000", cellFont);
        addTableCell(table, "13%", cellFont);

        // 第七行
        categoryCell = createMergedCell("日用品", cellFont, new BaseColor(230, 255, 240), 1, 3);
        table.addCell(categoryCell);
        addTableCell(table, "¥2,200,000", cellFont);
        addTableCell(table, "35%", cellFont);

        // 第八行 - 分解为区域数据
        addTableCell(table, "个人护理", cellFont, new BaseColor(255, 230, 240));
        PdfPCell complexCell2 = createMergedCell("全国数据", cellFont, new BaseColor(220, 240, 255), 1, 2);
        table.addCell(complexCell2);
        addTableCell(table, "¥1,200,000", cellFont);
        addTableCell(table, "19%", cellFont);

        return table;
    }

    // 创建表头单元格
    private static void addTableHeader(PdfPTable table, String text, Font font) {
        PdfPCell cell = new PdfPCell(new Phrase(text, font));
        cell.setBackgroundColor(HEADER_COLOR);
        cell.setHorizontalAlignment(Element.ALIGN_CENTER);
        cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
        cell.setPadding(5);
        table.addCell(cell);
    }

    // 创建普通单元格
    private static void addTableCell(PdfPTable table, String text, Font font) {
        addTableCell(table, text, font, BaseColor.WHITE);
    }

    private static void addTableCell(PdfPTable table, String text, Font font, BaseColor bgColor) {
        PdfPCell cell = new PdfPCell(new Phrase(text, font));
        cell.setBackgroundColor(bgColor);
        cell.setHorizontalAlignment(Element.ALIGN_CENTER);
        cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
        cell.setPadding(5);
        table.addCell(cell);
    }

    // 创建合并的单元格（跨列）
    private static PdfPCell createMergedCellColumn(String text, Font font, BaseColor bgColor, int colspan) {
        return createMergedCell(text, font, bgColor, colspan, 1);
    }
//
    // 创建合并的单元格（跨行）
    private static PdfPCell createMergedCellRow(String text, Font font, BaseColor bgColor, int rowspan) {
        return createMergedCell(text, font, bgColor, 1, rowspan);
    }

    // 创建合并的单元格（跨行和列）
    private static PdfPCell createMergedCell(String text, Font font, BaseColor bgColor, int colspan, int rowspan) {
        PdfPCell cell = new PdfPCell(new Phrase(text, font));
        cell.setBackgroundColor(bgColor);
        cell.setHorizontalAlignment(Element.ALIGN_CENTER);
        cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
        cell.setPadding(5);
        cell.setColspan(colspan);
        cell.setRowspan(rowspan);
        return cell;
    }
}
